package com.lmaye.common;

import com.fasterxml.jackson.annotation.JsonInclude;
import lombok.AllArgsConstructor;
import lombok.Data;

import java.io.Serializable;
import java.util.Objects;

/**
 * -- 请求响应
 *
 * @author lmay.Zhou
 * @date 2019/6/10 12:54 星期一
 * @qq 379839355
 * @email lmay@lmaye.com
 */
@Data
@AllArgsConstructor
@JsonInclude(JsonInclude.Include.NON_NULL)
public class BaseResponse<T> implements Serializable {
    private static final long serialVersionUID = 1L;

    /**
     * 响应代码
     */
    private String code;

    /**
     * 响应消息
     */
    private String description;

    /**
     * 响应数据
     */
    private T data;

    /**
     * 操作成功
     *
     * @param data 数据
     * @param <T>  泛型
     * @return Response<T>
     */
    public static <T> BaseResponse<T> success(T data) {
        return new BaseResponse<>("000000", "操作成功", data);
    }

    /**
     * 操作成功
     *
     * @param msg  消息
     * @param data 数据
     * @param <T>  泛型
     * @return Response<T>
     */
    public static <T> BaseResponse<T> success(String msg, T data) {
        return new BaseResponse<>("000000", msg, data);
    }

    /**
     * 操作失败
     *
     * @param <T> 泛型
     * @return Response<T>
     */
    public static <T> BaseResponse<T> failed() {
        ErrorInfo error = ErrorInfo.error();
        return new BaseResponse<>(error.getCode(), error.getMsg(), null);
    }

    /**
     * 操作失败
     * - 自定义信息
     *
     * @param msg 错误信息
     * @param <T> 泛型
     * @return Response<T>
     */
    public static <T> BaseResponse<T> failed(String msg) {
        ErrorInfo error = ErrorInfo.error(msg);
        return new BaseResponse<>(error.getCode(), error.getMsg(), null);
    }

    /**
     * 操作失败
     * - 错误对象
     *
     * @param error 错误对象
     * @param <T>   泛型
     * @return Response<T>
     */
    public static <T> BaseResponse<T> failed(ErrorInfo error) {
        return new BaseResponse<>(error.getCode(), error.getMsg(), null);
    }

    /**
     * 响应结果
     *
     * @param code 代码
     * @param msg  消息
     * @param data 数据
     * @param <T>  泛型
     * @return Response<T>
     */
    public static <T> BaseResponse<T> response(String code, String msg, T data) {
        return new BaseResponse<>(code, msg, data);
    }

    /**
     * 判断响应结果是否成功
     *
     * @return boolean
     */
    public boolean isSuccess() {
        if (Objects.isNull(code)) {
            return false;
        }
        return Objects.equals(Integer.valueOf("000000"), code);
    }
}